package CutLoad.components.container
{
	
	import CutLoad.Base;
	/**
	 * 表格布局容器
	 *  
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */	
	public class ContainerT extends Base
	{
		protected var arrWH:Array;
		protected var arrNowWH:Array;
		private var isInit:Boolean=false;
		//外观尺寸
		protected var displayWidth:Number=0,displayHeight:Number=0;
		//
		private var arrChilde:Array;
		//最小宽高
		private var minWidth:Number=0,minHeight:Number=0
		//
		public function ContainerT()
		{
		}
		/**
		 * 
		 * @param arrWH [[列宽1,列宽2...],[行高1,行高2...]] 注：列宽，行高的数值可以是固定的长度，或者是小数表示的百分比，特别要注意的就是：1表示是百分百
		 * @param w  宽
		 * @param h 高
		 * <p>注:百分比是以基础相乘所得到的：实际的宽或高减去固定的长度</p>
		 * <p>注:如果设置的宽或高小于初始化时设置的宽高，将无效 !</p>
		 * <p>注:这果不能自动更新单元格的情况，如果单元格的内容改变，可能要调用update让他更新。</p>
		 * 
		 */	
		public function init(arrWH:Array,w:Number,h:Number):void{
			if(arrWH.length!=2) throw new Error("ContainerT 配置信息错误#1 !");
			//禁止第一次不要update
			isInit=true;
			this.arrWH=arrWH;
			var arrCo:Array=arrWH[0];
			var arrRo:Array=arrWH[1];
			arrNowWH=new Array();
			for(var j:Number=0;j<arrRo.length;j++){
				if(arrRo[j]>1){
					minHeight+=arrRo[j]
				}
				var arrNowWHRow:Array=new Array();
				for(var i:Number=0;i<arrCo.length;i++){
					if(arrCo[i]>1){
						minWidth+=arrCo[i]
					}
					var csTem:ContainerS=new ContainerS();
					csTem.show(this);
					arrNowWHRow.push(csTem);
				}
				arrNowWH.push(arrNowWHRow);
			}
			minWidth+=5;
			minHeight+=5;
			this.setWH(w,h);
		}
		/**
		 * 刷新 
		 * 
		 */		
		public function update():void{
			if(!isInit) return;
			var arrCo:Array=arrWH[0];
			var arrRo:Array=arrWH[1];
			//把百分比转换成数值
			var lenCoForP:Number=getLevaLen(arrCo,this.getShowWidth());
			var lenRoForP:Number=getLevaLen(arrRo,this.getShowHeight());
			var ww:Number,hh:Number,childT:Number;
			var nowXTem:Number=0,nowYTem:Number=0;
			var nowXTem1:Number=0,nowYTem1:Number=0;
			for(var j:Number=0;j<arrRo.length;j++){
				if(arrRo[j]>1){
					hh=arrRo[j];
				}else{
					hh=arrRo[j]*lenRoForP;
				}
				nowYTem1=nowYTem
				if(j==0){
					nowYTem=hh;
				}else{
					nowYTem+=hh;
				}
				nowXTem=0;
				//
				for(var i:Number=0;i<arrCo.length;i++){
					if(arrCo[i]>1){
						ww=arrCo[i];
					}else{
						ww=arrCo[i]*lenCoForP;
					}
					nowXTem1=nowXTem
					
					if(i==0){
						nowXTem=ww;
					}else{
						nowXTem+=ww;
					}
					var csTem:ContainerS=arrNowWH[j][i]
					csTem.setXY(nowXTem1,nowYTem1);
					//csTem.showGuide()
					csTem.setWH(ww,hh);
				}
			}
		}
		/**
		 * 获得表格的宽高配置信息 
		 * @return 
		 * 
		 */		
		public function getConfigWH():Array{
			return this.arrWH;
		}
		/**
		 * 获得表格里单元格数组信息 
		 * @return 
		 * 
		 */		
		public function getConfigCS():Array{
			return this.arrNowWH;	
		}
		//显示附助线
		public function showGuide():void{
			for(var j:Number=0;j<arrNowWH.length;j++){
				for(var i:Number=0;i<arrNowWH[0].length;i++){
					var csTem:ContainerS=arrNowWH[j][i]
					csTem.showGuide();
				}
			}
		}
		/**
		 * 获得单元格容器
		 * @param row 行
		 * @param col 列
		 * @return 
		 * 
		 */		
		public function getOne(row:Number,col:Number):ContainerS{
			if(row<0||col<0) throw new Error("参数错误#1");
			return arrNowWH[row][col]
		}
		/**
		 * 把一个元素添加到表格容器里某一个单元格里 
		 * @param row 行
		 * @param col 列
		 * @param base 要添加的元素
		 * @param isShow 添加的元素是显示还是隐藏
		 * 
		 */		
		public function append(row:Number,col:Number,base:Base,isShow:Boolean=true):void{
			var cs:ContainerS=getOne(row,col);
			cs.append(base,isShow);
		}
		/**
		 * 把一个元素添加到表格容器里某一个单元格里 并设置对齐方式
		 * @param row
		 * @param col
		 * @param base
		 * @param t 参数说明：0居中,1左上,2上中,3右上,4右中,5右下,6下中,7左下,8左中
		 * @return 
		 * 
		 */		
		public function appendAlign(row:Number,col:Number,base:Base,t:Number=1):void{
			var cs:ContainerS=getOne(row,col);
			var cc:Container=new Container();
			cc.init({w:10,h:10});
			cc.append(base,true,{t:t});
			cs.append(cc);
		}
		/**
		 * 获得剩余的值 
		 * @param arrConfig
		 * @param len
		 * @return 
		 * 
		 */		
		public function getLevaLen(arrConfig:Array,len:Number):Number{
			var lenTem:Number=0
			for(var i:Number=0;i<arrConfig.length;i++){
				if(arrConfig[i]>=1){
					lenTem+=arrConfig[i]
				}
			}
			var leaveLen:Number=len-lenTem;
			return leaveLen;
		}
		/**
		 * 改变宽，高  注：宽或高小于初始化时设置的值，将无效 
		 * @param w
		 * @param h
		 * 
		 */		
		override public function setWH(w:Number=0, h:Number=0):void{
			if(w==0) w=this.getShowWidth();
			if(h==0) h=this.getShowHeight();
			//
			if(this.minWidth!=0){
				if(w<this.minWidth) w=this.minWidth;
			}
			if(this.minHeight!=0){
				if(h<this.minHeight) h=this.minHeight;
			}
			//
			displayWidth=w;
			displayHeight=h;
			//
			update();
		}
		override public function getShowWidth():Number{
			return displayWidth;
		}
		override public function getShowHeight():Number{
			return displayHeight;
		}
	}
}